"""
RTZL AI Web 后端主应用
基于 FastAPI + Hypercorn 构建的智能AI管理平台
"""

import asyncio
import os
from contextlib import asynccontextmanager

import dotenv
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from hypercorn.asyncio import serve
from hypercorn.config import Config

from config.exception_handlers import register_exception_handlers
from config.initializer import app_initializer
from config.logging_config import setup_logging, get_logger
from constant.settings import settings
from middleware.logging_middleware import LoggingMiddleware
from router import api_router
from utils.warning_suppressor import init_warning_suppression

# 初始化日志配置
setup_logging()
logger = get_logger(__name__)
# 加载环境变量
dotenv.load_dotenv()
# 使用统一的警告抑制器
init_warning_suppression()


@asynccontextmanager
async def lifespan(app: FastAPI):
    """应用生命周期管理"""
    # 启动时初始化
    logger.info("🚀 启动 RTZL AI Web 后端服务")

    # 使用初始化管理器执行所有初始化
    await app_initializer.initialize_all()

    logger.info(f"🌟 服务启动完成，运行在 {settings.HOST}:{settings.PORT}")

    yield

    # 关闭时清理
    logger.info("🛑 正在关闭服务")
    await app_initializer.cleanup()


def create_app() -> FastAPI:
    """创建并配置FastAPI应用"""
    # 创建FastAPI应用
    app = FastAPI(
        title="RTZL AI Web API",
        description="基于 LangGraph + LangChain 的智能AI管理平台",
        version="1.0.0",
        docs_url="/docs",
        lifespan=lifespan
    )

    # 注册异常处理器
    register_exception_handlers(app)

    # 添加日志中间件（需要在CORS中间件之前添加）
    app.add_middleware(LoggingMiddleware)

    # 配置CORS
    app.add_middleware(
        CORSMiddleware,
        allow_origins=settings.ALLOWED_ORIGINS,
        allow_credentials=True,
        allow_methods=["*"],
        allow_headers=["*"],
    )

    # 挂载静态文件
    app.mount("/uploads", StaticFiles(directory="uploads"), name="uploads")

    # 注册路由
    app.include_router(api_router, prefix="/api")

    # 基本路由
    @app.get("/")
    async def root():
        """根路径健康检查"""
        return {
            "message": "RTZL AI Web API 服务运行正常",
            "version": "1.0.0",
            "status": "healthy"
        }

    @app.get("/health")
    async def health_check():
        """健康检查端点"""
        return {
            "status": "healthy",
            "service": "RTZL AI Web",
            "version": "1.0.0"
        }

    return app


# 创建应用实例
app = create_app()


async def main():
    """
    主函数 - 使用Hypercorn启动服务
    注意：serve()函数始终为单进程模式
    如需多进程，请使用 scripts/start_production.py 或直接用命令行启动
    """
    logger.info("🚀 启动Hypercorn服务器")

    try:
        # 创建Hypercorn配置
        config = Config()
        config.bind = [f"{settings.HOST}:{settings.PORT}"]
        config.use_reloader = settings.DEBUG  # 开发环境启用重载

        # 设置其他配置选项
        config.worker_class = "asyncio"
        config.access_log_format = '%(h)s %(r)s %(s)s %(b)s %(D)s'

        # 更多配置选项
        config.keep_alive_timeout = 5
        config.loglevel = os.environ.get("LOG_LEVEL", "info").lower()

        # 设置优雅关闭超时
        config.graceful_timeout = 30  # 优雅关闭超时时间

        # 生产环境额外配置（注意：serve()函数始终为单进程）
        if not settings.DEBUG:
            config.max_requests = 1000  # 每个进程最大请求数
            config.max_requests_jitter = 100  # 添加随机抖动

        logger.info(f"🌐 服务器配置: {config.bind[0]}, 调试模式: {settings.DEBUG}, 模式: 单进程(serve)")

        # 使用asyncio.run启动Hypercorn服务器
        await serve(app, config)

    except Exception as e:
        logger.error(f"❌ 服务器启动失败: {e}", exc_info=True)


if __name__ == "__main__":
    # 使用asyncio.run启动程序
    asyncio.run(main())
